/*
* @ Author: Somerst Zhai
* @ Data: 2018-10-16 15:54:22
* @ Revision: 1.0
* @ Purpose: 封装axios
* */

import axios from 'axios'
import config from './config'
import qs from 'qs'
import { Message, MessageBox } from 'element-ui'
// import router from 'vue-router'

export default function $axios (options) {
  return new Promise((resolve, reject) => {
    const instance = axios.create({
      baseURL: config.baseUrl,
      headers: config.headers,
      data: options.data,
      // responseType: config.responseType,
      withCredentials: config.withCredentials,
      transformResponse: [function (data) {}]
    })
    console.info('promise', instance)
    // request 拦截器
    instance.interceptors.request.use(
      config => {
        // Tip1：可添加加载动画
        // Tip2: 携带 token，可以结合 vuex 或者重 localStorage
        // 若是有做鉴权token , 就给头部带上token
        // 若是需要跨站点,存放到 cookie 会好一点,限制也没那么多,有些浏览环境限制了 localstorage 的使用
        // 这里localStorage一般是请求成功后我们自行写入到本地的,因为你放在vuex刷新就没了
        // 一些必要的数据写入本地,优先从本地读取
        // if (localStorage.token) {
        //   config.headers.Authorization = localStorage.token;
        // } else {
        //   // 重定向到登陆页面
        // }
        if (config.method.toLocaleLowerCase() === 'post' || config.method.toLocaleLowerCase() === 'put' || config.method.toLocaleLowerCase() === 'delete') {
          config.data = qs.stringify(config.data)
        }
        return config
      },
      error => {
        // tip1 判断请求超时
        if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
          console.log('根据你设置的timeout/真的请求超时 判断请求现在超时了，你可以在这里加入超时的处理方案')
          // return service.request(originalRequest);//例如再重复请求一次
        }
        // tip2 重定向到指定页面或者
        // tip2.1 跳转到固定路由
        // const errorInfo = error.response
        // console.log(errorInfo)
        // if (errorInfo) {
        //   // error =errorInfo.data//页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
        //   // 404 403 500 ... 等
        //   const errorStatus = errorInfo.status
        //   router.push({
        //     // 错误页面路由
        //     path: `/error/${errorStatus}`
        //   })
        // }
        // tip2.2弹出错误提醒，这里用的是
        Message({
          //  饿了么的消息弹窗组件,类似toast
          showClose: true,
          message: error && error.data.error.message,
          type: 'error'
        })
        return Promise.reject(error)
      }
    )
    // response 拦截器
    instance.interceptors.response.use(
      response => {
        console.log(response)
        let data
        // Tip1
        // 判断是否支持IE9
        if (response.request.response === undefined) {
          data = response.request.responseText
        } else {
          data = response.request.response
        }
        console.log(data instanceof Object)
        if (!(data instanceof Object)) {
          data = JSON.parse(data)
        }
        // Tip2
        // 判断是否是正确数据,接口的返回数据包含
        if (data && !data.success) {
          // 这个地方需要注意返回数据的数据结构
          MessageBox({
            message: data.error.message.message
              ? data.error.message.message
              : data.error.message,
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning',
            center: true
          }).then(() => {
            Message({
              type: 'success',
              message: '删除成功!'
            })
          }).catch(() => {
            Message({
              type: 'info',
              message: '已取消删除'
            })
          })
        }
        return response
      },
      error => {
        // tip1 这里根据返回的错误信息可以根据用户的登录状态进行一系列判断
        // 判断用户是否因为登录，导致的error
        // 判断是否是因为用户登录的生命周期，导致的error
        // 使用路由跳转到登录界面进行登录
        // tip2 判断错误代码，错误提醒
        if (error && error.response) {
          switch (error.response.status) {
            case 400:
              error.message = '请求错误'
              break
            case 401:
              error.message = '未授权，请登录'
              break
            case 403:
              error.message = '拒绝访问'
              break
            case 404:
              error.message = `请求地址出错: ${error.response.config.url}`
              break
            case 408:
              error.message = '请求超时'
              break
            case 500:
              error.message = '服务器内部错误'
              break
            case 501:
              error.message = '服务未实现'
              break
            case 502:
              error.message = '网关错误'
              break
            case 503:
              error.message = '服务不可用'
              break
            case 504:
              error.message = '网关超时'
              break
            case 505:
              error.message = 'HTTP版本不受支持'
              break
            default:
          }
        }
        // 错误提醒
        Message({
          // 饿了么的消息弹窗组件,类似toast
          showClose: true,
          message: error.message.message
            ? error.message.message
            : error.message,
          type: 'error'
        })
        return Promise.reject(error)
      }
    )
    // 请求处理
    instance(options)
      .then((res) => {
        resolve(JSON.parse(res.request.response))
        // resolve(res.request.response)
        // console.info('res.request.response', res.request.response)
        // return false
      })
      .catch((error) => {
        reject(error)
      })
  })
}
